package kr.co.bettersoft.sendme.activity;

import java.util.ArrayList;
import java.util.List;

import kr.co.bettersoft.sendme.provider.SendMeCertification;
import kr.co.bettersoft.sendme.provider.SendMeInstall;
import kr.co.bettersoft.sendme.provider.SendMeLog;
import kr.co.bettersoft.sendme.provider.SendMeMember;
import kr.co.bettersoft.sendme.rest.SendMeCertificationRest;
import kr.co.bettersoft.sendme.rest.SendMeInstallRest;
import kr.co.bettersoft.sendme.rest.SendMeLogRest;
import kr.co.bettersoft.sendme.rest.SendMeMemberRest;
import kr.co.bettersoft.sendme.util.SendMeActivityManager;
import kr.co.bettersoft.sendme.util.SendMeCommon;
import kr.co.bettersoft.sendme.util.SendMeConstant;
import kr.co.bettersoft.sendme.activity.R;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.SharedPreferences;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.provider.ContactsContract;
import android.telephony.TelephonyManager;
import android.util.Log;
import android.view.Gravity;
import android.view.Menu;
import android.view.View;
import android.view.Window;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageButton;
import android.widget.ProgressBar;
import android.widget.Toast;
import android.widget.ToggleButton;

public class SendMeSubSettingsPasswordActivity extends Activity {

	public static String TAG = SendMeSubSettingsPasswordActivity.class.getSimpleName();
	
	
	// 액티비티 매니저를 가져 온다.
	private SendMeActivityManager sendMeActivityManager = SendMeActivityManager.getInstance();
	
	ImageButton imageButtonTopBack;
	ImageButton imageButtonTopMainMenu;
	
	// 마스터 암호.
	private String MASTER_PASSWORD = "";
		
	// 퍼블릭 암호.
	private String PUBLIC_PASSWORD = "";
	
	// 기능 모드.(MASTER/PUBLIC)
	private String FUNCTION_MODE = "";
	
	// 사용자 휴대 전화번호.
	private String PHONE_NUMBER = "";
	
	View password_setting_layout_1;
	View password_setting_layout_2;
	
	
//	Button passwordSettingChangePasswordBtn;
	View passwordSettingChangePasswordLayout;
	
	Button buttonPasswordInit;
	Button buttonMasterKeyChange;
	Button buttonPublicKeyChange;
	
	// 초기화 레이아웃. 퍼블릭 로그인시 안보이도록함.
	View passwordInitLayout;

	
	// 로그를 남긴다
	private static final int THREAD_REGISTER_LOG = 100;
	
	// 비밀번호 설정 초기화했다는 toast를 띄운다
	private static final int THREAD_SUCCESS_INIT_PASSWORD = 119;
	
	// 비밀번호 설정 초기화할지 확인 받는 dialog 를 띄운다.
	private static final int THREAD_CONFIRM_INIT_PASSWORD = 120;
	
	// 사용자 확인 창을 띄운다
	private static final int ALERT_SHOW_MESSAGE = 105;
	
	// 암호 설정 액티비티 요청 코드
	private static final int PASSWORD_ACTIVITY_CODE = 135;		
	
	// 전달할 동작 코드의 액션
	private static final int ACTION_CODE_SOME_KEY_CHECK = 201;			//  키 확인 (마스터 또는 퍼블릭)
	private static final int ACTION_CODE_MASTER_KEY_SETTING = 211;		//  마스터 키 세팅
	private static final int ACTION_CODE_MASTER_KEY_CHECK  = 212;		//  마스터 키 확인
	private static final int ACTION_CODE_MASTER_KEY_CHANGE  = 213;		//  마스터 키 변경
	private static final int ACTION_CODE_PUBLIC_KEY_SETTING  = 221;		//  퍼블릭 키 세팅
	private static final int ACTION_CODE_PUBLIC_KEY_CHECK  = 222;		//  퍼블릭 키 확인
	private static final int ACTION_CODE_PUBLIC_KEY_CHANGE  = 223;		//  퍼블릭 키 변경
		
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		
		// 커스텀 타이블 바를 설정 한다.
		Window window = getWindow();
		window.requestFeature(Window.FEATURE_CUSTOM_TITLE);
				
		setContentView(R.layout.activity_send_me_sub_settings_password);
		
		window.setFeatureInt(Window.FEATURE_CUSTOM_TITLE, R.layout.custom_title_bar_03);
		
		// 액티비티 매니저에 담는다.
		sendMeActivityManager.addActivity(this);
		
		// 설정파일을 가져 온다.
		this.selectPreferenceData();
		
		
		// 뒤로 가기 화살표 버튼을 설정 한다.
		imageButtonTopBack = (ImageButton)findViewById(R.id.imageButtonTopBack);
		imageButtonTopBack.setOnClickListener(new View.OnClickListener() {

			@Override
			public void onClick(View v) {
				// TODO Auto-generated method stub

				// 화면을 닫는다.
				finishActivity();
			}
		});

		// 타이틀바의 메인 메뉴 버튼을 설정 한다.
		imageButtonTopMainMenu = (ImageButton)findViewById(R.id.imageButtonTopMainMenu);
		imageButtonTopMainMenu.setOnClickListener(new OnClickListener() {

			@Override
			public void onClick(View v) {
				// TODO Auto-generated method stub
				Log.i(TAG, "pressed top main menu.");

				selectPreferenceData();
				
				if(MASTER_PASSWORD.length()>0 && PUBLIC_PASSWORD.length()>0) {
					
					// 메인 메뉴 화면을 출력 한다.
					Intent i = new Intent(SendMeSubSettingsPasswordActivity.this, SendMeMainMenuActivity.class);
					startActivity(i);
					
					// 종료하기 전에 액티비티 매니져에서 액티비티를 삭제 한다.
					sendMeActivityManager.removeActivity(SendMeSubSettingsPasswordActivity.this);
					// 액티비티를 종료 한다.
					finish();
				} else if(MASTER_PASSWORD.length()<1 && PUBLIC_PASSWORD.length()<1) {
					
					// 메인 메뉴 화면을 출력 한다.
					Intent i = new Intent(SendMeSubSettingsPasswordActivity.this, SendMeMainMenuActivity.class);
					startActivity(i);
					
					// 종료하기 전에 액티비티 매니져에서 액티비티를 삭제 한다.
					sendMeActivityManager.removeActivity(SendMeSubSettingsPasswordActivity.this);
					// 액티비티를 종료 한다.
					finish();
				} else {
					showAlertMessage("Master Key와 Public Key 모두 설정해야 합니다.");
				}
				
			}
		});
		
		password_setting_layout_1 = findViewById(R.id.password_setting_layout_1);
		password_setting_layout_2 = findViewById(R.id.password_setting_layout_2);
		
		passwordInitLayout = findViewById(R.id.passwordInitLayout);
		
		
//		// 비번 변경. 모드에 따라 변경 모드로.
//		passwordSettingChangePasswordBtn = (Button) findViewById(R.id.passwordSettingChangePasswordBtn);
//		passwordSettingChangePasswordBtn.setOnClickListener(new OnClickListener() {
//			@Override
//			public void onClick(View v) {
//				SharedPreferences mSharedPreference = getSharedPreferences(SendMeConstant.SENDME_PREFERENCE, Activity.MODE_PRIVATE);
//				
//				Intent passwordActivity = new Intent(SendMeSubSettingsPasswordActivity.this, SendMePasswordActivity.class);
//				
//				// 현재 로그인 된 모드에 따라 분기
//				// 기능 모드.(MASTER/PUBLIC)
//				if(FUNCTION_MODE.equals("MASTER")) {
//					passwordActivity.putExtra("ACTION_CODE", ACTION_CODE_MASTER_KEY_CHANGE);
//					startActivityForResult(passwordActivity, PASSWORD_ACTIVITY_CODE);
//				} else if(FUNCTION_MODE.equals("PUBLIC")) {
//					passwordActivity.putExtra("ACTION_CODE", ACTION_CODE_PUBLIC_KEY_CHANGE);
//					startActivityForResult(passwordActivity, PASSWORD_ACTIVITY_CODE);
//				}else{
//					Log.d(TAG,"passwordSettingChangePasswordBtn FUNCTION_MODE:"+FUNCTION_MODE);
//				}
//				/*
//				 * 	private static final int ACTION_CODE_SOME_KEY_CHECK = 201;			//  키 확인 (마스터 또는 퍼블릭)
//	private static final int ACTION_CODE_MASTER_KEY_SETTING = 211;		//  마스터 키 세팅
//	private static final int ACTION_CODE_MASTER_KEY_CHECK  = 212;		//  마스터 키 확인
//	private static final int ACTION_CODE_MASTER_KEY_CHANGE  = 213;		//  마스터 키 변경
//	private static final int ACTION_CODE_PUBLIC_KEY_SETTING  = 221;		//  퍼블릭 키 세팅
//	private static final int ACTION_CODE_PUBLIC_KEY_CHECK  = 222;		//  퍼블릭 키 확인
//	private static final int ACTION_CODE_PUBLIC_KEY_CHANGE  = 223;		//  퍼블릭 키 변경
//				 */
//			}
//		});
		
		passwordSettingChangePasswordLayout = findViewById(R.id.passwordSettingChangePasswordLayout);
		passwordSettingChangePasswordLayout.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View v) {
				Intent passwordActivity = new Intent(SendMeSubSettingsPasswordActivity.this, SendMePasswordActivity.class);
				
				// 현재 로그인 된 모드에 따라 분기
				// 기능 모드.(MASTER/PUBLIC)
				if(FUNCTION_MODE.equals("MASTER")) {
					passwordActivity.putExtra("ACTION_CODE", ACTION_CODE_MASTER_KEY_CHANGE);
					startActivityForResult(passwordActivity, PASSWORD_ACTIVITY_CODE);
				} else if(FUNCTION_MODE.equals("PUBLIC")) {
					passwordActivity.putExtra("ACTION_CODE", ACTION_CODE_PUBLIC_KEY_CHANGE);
					startActivityForResult(passwordActivity, PASSWORD_ACTIVITY_CODE);
				}else{
					Log.d(TAG,"passwordSettingChangePasswordLayout FUNCTION_MODE:"+FUNCTION_MODE);
				}
			}
		});
		

		// 초기화 - 설정에 있는 모든 비번 설정을 지운다
		buttonPasswordInit = (Button) findViewById(R.id.buttonPasswordInit);
		buttonPasswordInit.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View v) {
				mHandler.sendMessage(mHandler.obtainMessage(THREAD_CONFIRM_INIT_PASSWORD));		
			}
		});
		
		
		// 초기화 이후 마스터 키 설정
		buttonMasterKeyChange = (Button) findViewById(R.id.buttonMasterKeyChange);
		buttonMasterKeyChange.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View v) {
				
				Intent passwordActivity = new Intent(SendMeSubSettingsPasswordActivity.this, SendMePasswordActivity.class);
				passwordActivity.putExtra("ACTION_CODE", ACTION_CODE_MASTER_KEY_CHANGE);

				startActivityForResult(passwordActivity, PASSWORD_ACTIVITY_CODE);
			}
		});
		
		// 초기화 이후 퍼블릭 키 설정
		buttonPublicKeyChange = (Button) findViewById(R.id.buttonPublicKeyChange);
		buttonPublicKeyChange.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View v) {
				
				Intent passwordActivity = new Intent(SendMeSubSettingsPasswordActivity.this, SendMePasswordActivity.class);
				passwordActivity.putExtra("ACTION_CODE", ACTION_CODE_PUBLIC_KEY_CHANGE);
				
				startActivityForResult(passwordActivity, PASSWORD_ACTIVITY_CODE);
			}
		});
		

		
		// 설정된 암호가 있다면 암호창을 띄우고, 설정된 암호가 없다면 암호 설정 화면으로 전환한다.
		if(MASTER_PASSWORD.length()>0 && PUBLIC_PASSWORD.length()>0) {
			Log.d(TAG, "password exist");
			Intent passwordActivity = new Intent(SendMeSubSettingsPasswordActivity.this, SendMePasswordActivity.class);
			
			Log.d(TAG,"FUNCTION_MODE:"+FUNCTION_MODE);
			if(FUNCTION_MODE.equals("MASTER")){
				passwordActivity.putExtra("ACTION_CODE", ACTION_CODE_MASTER_KEY_CHECK);
				startActivityForResult(passwordActivity, PASSWORD_ACTIVITY_CODE);
			} else if(FUNCTION_MODE.equals("PUBLIC")) {
				passwordActivity.putExtra("ACTION_CODE", ACTION_CODE_PUBLIC_KEY_CHECK);
				startActivityForResult(passwordActivity, PASSWORD_ACTIVITY_CODE);
			} else {
				Log.d(TAG, "no mode..");
			}
			
		// 초기화 상태니까 암호 설정 모드로	
		} else {
			Log.d(TAG, "password not exist");
			password_setting_layout_1.setVisibility(View.GONE);
			password_setting_layout_2.setVisibility(View.VISIBLE);
		}
		
		
		// 로깅.
		mHandler.sendMessage(mHandler.obtainMessage(THREAD_REGISTER_LOG));
		
		
	}

	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		// Inflate the menu; this adds items to the action bar if it is present.
		getMenuInflater().inflate(R.menu.send_me_certification, menu);
		return true;
	}
	
	/**
	 * Handler 를 정의 한다.
	 * 모든 Thread 를 등록해 놓고 호출 한다.
	 */
	private Handler mHandler = new Handler() {
		@Override
		public void handleMessage(Message msg) {
			Bundle b = msg.getData();
			switch(msg.what) {
			
			// 로그를 남긴다
			case THREAD_REGISTER_LOG : 
				threadRegisterLog();
				break;
			// 비밀번호 설정을 초기화할지 확인받는 dialog 를 띄운다.
			case THREAD_CONFIRM_INIT_PASSWORD : 
				showDialogFailToRegisterMember();		
				break;
			// 비밀번호 설정을 초기화했다는 toast를 띄운다
			case THREAD_SUCCESS_INIT_PASSWORD : 	
				showToastSuccessInitPassword();		
				break;

			// 사용자 확인창을 띄운다	
			case ALERT_SHOW_MESSAGE:
				new AlertDialog.Builder(returnThis())
				.setTitle("비밀번호 설정")							
				.setMessage(b.getString("msg"))
				.setIcon(R.drawable.ic_launcher)		// 경고창.  
				.setPositiveButton(android.R.string.yes, new DialogInterface.OnClickListener() {
					public void onClick(DialogInterface dialog, int whichButton) {
						// 그냥 사용자 확인 용이기 때문에 추가 조작 없음.
					}})
					.setNegativeButton("", null).show();
				
			}
		}
	};

	
	public Context returnThis() {
		return this;
	}
	
	
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
	// 알림, 토스트
	
	/**
	 * 멤버 가입에 실패했다는 dialog 를 띄운다.
	 */
	private void showDialogFailToRegisterMember() {
		new AlertDialog.Builder(SendMeSubSettingsPasswordActivity.this)
		.setTitle("비밀번호 설정")
		.setMessage("비밀번호 설정을 초기화하시겠습니까?")
//		.setIcon(R.drawable.ic_launcher)	
		.setPositiveButton(android.R.string.yes, new DialogInterface.OnClickListener() {
			public void onClick(DialogInterface dialog, int whichButton) {
				initPreferenceData();
			}})
			.setNegativeButton(android.R.string.no, null).show();
	}
	
	/**
	 * showResultDialog
	 * 확인 창을 띄운다
	 *
	 * @param msg
	 * @param 
	 * @return 
	 */
	public void showAlertMessage(final String msg) {
		runOnUiThread(new Runnable() {		 
			@Override
			public void run(){
				Message message = mHandler.obtainMessage(ALERT_SHOW_MESSAGE);				
				Bundle b = new Bundle();
				b.putString("msg", msg);			// 화면에 보여줄 메시지
				message.setData(b);
				mHandler.sendMessage(message);
			}
		});
	}
	
	
	/**
	 * 초기화 성공했다는 toast를 띄운다
	 */
	public void showToastSuccessInitPassword() {
		CharSequence text = "비밀번호 설정이 초기화되었습니다.";
		Toast toast = Toast.makeText(getApplicationContext(), text, Toast.LENGTH_SHORT);
		toast.setGravity(Gravity.CENTER_VERTICAL|Gravity.CENTER_HORIZONTAL, 0, 0);
		toast.show();
	}
	
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
	
	@Override
	public void onActivityResult(int requestCode, int resultCode, Intent data) {
		super.onActivityResult(requestCode, resultCode, data);
		Bundle extraBundle;
		if( requestCode == PASSWORD_ACTIVITY_CODE ) {
			if(resultCode == Activity.RESULT_OK) {		// 정상 반환시.
				
				Log.d(TAG,"RESULT_OK");
				extraBundle = data.getExtras();		// 번들을 반환했으니까 번들을 불러오면 세팅된 값을 가지고 있음.

				int actionCode = extraBundle.getInt("actionCode");	
				String passwordActivityResult = extraBundle.getString("passwordActivityResult");	
				Log.d(TAG,"passwordActivityResult:"+passwordActivityResult);
				
				if(passwordActivityResult.equals("SUCCESS")) {
					if(actionCode==ACTION_CODE_MASTER_KEY_CHECK || actionCode==ACTION_CODE_PUBLIC_KEY_CHECK) {
						
						switch(actionCode) {
						case ACTION_CODE_MASTER_KEY_CHECK:
							// nothing to do
							Log.d(TAG,"actionCode:ACTION_CODE_MASTER_KEY_CHECK");
							passwordInitLayout.setVisibility(View.VISIBLE);
							break;
						case ACTION_CODE_PUBLIC_KEY_CHECK:
							// hide init button
							Log.d(TAG,"actionCode:ACTION_CODE_PUBLIC_KEY_CHECK");

							passwordInitLayout.setVisibility(View.GONE);
							break;
						}
					} else if(actionCode==ACTION_CODE_MASTER_KEY_CHANGE || actionCode==ACTION_CODE_PUBLIC_KEY_CHANGE) {
						selectPreferenceData();
						Log.d(TAG,"FUNCTION_MODE:"+FUNCTION_MODE);
						Log.d(TAG,"MASTER_PASSWORD:"+MASTER_PASSWORD);
						Log.d(TAG,"PUBLIC_PASSWORD:"+PUBLIC_PASSWORD);
						//비번 두개 모두 설정된 상태 
						if(MASTER_PASSWORD.length()>0 && PUBLIC_PASSWORD.length()>0) {
							//  초기화 후 설정된 경우일때 -> MASTER 모드로 로그인한걸로 인정. 빠져나감
							if(FUNCTION_MODE.length()<1) {
								// 설정 변경
								Log.d(TAG,"set FUNCTION_MODE - MASTER");
								FUNCTION_MODE = "MASTER";
								SharedPreferences sharedPreferences = getSharedPreferences(SendMeConstant.SENDME_PREFERENCE, Activity.MODE_PRIVATE);
								SharedPreferences.Editor editor = sharedPreferences.edit();
								editor.putString("function_mode", FUNCTION_MODE);
								editor.commit();
								
								// 빠져나감
								finishActivity();
							// 일반 적인 비번 변경일때는 그냥 빠져나감	
							} else {
								// 빠져나감
								finishActivity();
							}
						}
					}
				}
				
			} else if(resultCode == Activity.RESULT_CANCELED) {
				Log.d(TAG,"RESULT_CANCELED");
				selectPreferenceData();
				
				if(MASTER_PASSWORD.length()>0 && PUBLIC_PASSWORD.length()>0) {
					finishActivity();
				} else if(MASTER_PASSWORD.length()<1 && PUBLIC_PASSWORD.length()<1) {
					finishActivity();
				}
			}
		}
	}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
	// 서버 통신
	
	
	/**
	 * 로그를 남긴다	 
	 */
	public void threadRegisterLog() {
		Thread thread = new Thread(new Runnable() {
			public void run() {
				
				SendMeCommon sendMeCommon = new SendMeCommon();
				String nowTime = sendMeCommon.getCurrentDate();
				
				SendMeLog sendMeLog = new SendMeLog();
				sendMeLog.setPhoneNumber(PHONE_NUMBER);
				sendMeLog.setViewName(TAG);
				sendMeLog.setRegisterDate(nowTime);
				
				SendMeLogRest sendMeLogRest = new SendMeLogRest();
				
				sendMeLogRest.registerLog(sendMeLog);
			}
		});
		thread.start();
	}
	
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////	
	/**
	 * SharedPreference 정보를 확인 한다.
	 */
	public void selectPreferenceData() {
		SharedPreferences mSharedPreference = getSharedPreferences(SendMeConstant.SENDME_PREFERENCE, Activity.MODE_PRIVATE);
		
		PHONE_NUMBER = mSharedPreference.getString("phone_number", "");
		
		MASTER_PASSWORD = mSharedPreference.getString("master_password", "");
		PUBLIC_PASSWORD = mSharedPreference.getString("public_password", "");
		FUNCTION_MODE = mSharedPreference.getString("function_mode", "");
	}
	
	/**
	 * 비밀번호 관련 설정을 초기화 한다
	 */
	public void initPreferenceData(){
			
			// 저장
			SharedPreferences sharedPreferences = getSharedPreferences(SendMeConstant.SENDME_PREFERENCE, Activity.MODE_PRIVATE);
			SharedPreferences.Editor editor = sharedPreferences.edit();
			editor.putString("master_password", "");
			editor.putString("public_password", "");
			editor.putString("function_mode", "");
			editor.commit();

			// 토스트 후 종료
			mHandler.sendMessage(mHandler.obtainMessage(THREAD_SUCCESS_INIT_PASSWORD));
			
			finishActivity();
	}
	
	
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////	
	// 뒤로가기, 닫기 관련
	
	/**
	 * 뒤로 가기 버튼을 정의 한다.
	 * 앱 실행시의 암호 입력화면이기 때문에 뒤로가기 버튼을 터치하면 앱을 종료 한다.
	 */
	@Override
	public void onBackPressed() {
		
		// 화면을 닫는다.
		finishActivity();
	}
	
	// 종료
	public void finishActivity(){
		
		selectPreferenceData();
		
		if(MASTER_PASSWORD.length()>0 && PUBLIC_PASSWORD.length()>0) {
			// 종료하기 전에 액티비티 매니져에서 액티비티를 삭제 한다.
			sendMeActivityManager.removeActivity(SendMeSubSettingsPasswordActivity.this);
			// 액티비티를 종료 한다.
			Intent intent = new Intent(returnThis(), SendMeSettingsActivity.class);
			startActivity(intent);
			finish();
		} else if(MASTER_PASSWORD.length()<1 && PUBLIC_PASSWORD.length()<1) {
			// 종료하기 전에 액티비티 매니져에서 액티비티를 삭제 한다.
			sendMeActivityManager.removeActivity(SendMeSubSettingsPasswordActivity.this);
			// 액티비티를 종료 한다.
			Intent intent = new Intent(returnThis(), SendMeSettingsActivity.class);
			startActivity(intent);
			finish();
		} else {
			showAlertMessage("Master Key와 Public Key 모두 설정해야 합니다.");
		}
	}	
	


}
